#include "head.h"

S_arr_list *Init_S_arr_list(void)
{
    // 创建数据关系 的空间
    S_arr_list *L = (S_arr_list *)malloc(sizeof(S_arr_list));
    if (NULL == L)
    {
        printf("动态顺序表创建失败");
        return NULL;
    }
    // 创建数据 的空间
    L->max = 5;
    L->data = (F_data *)malloc(L->max * sizeof(F_data));
    if (NULL == L->data)
    {
        printf("数据空间创建失败\n");
        return NULL;
    }
    // 长度初始化
    L->len = 0;
    return L;
}

// 顺序表的扩容：
int Expand_S_arr_list(S_arr_list *L, int size)
{
    // 1、安全判断
    if (NULL == L)
    {
        printf("这片空间不能存在\n");
        return EOF;
    }
    if (size < L->len)
    {
        printf("创建的空间太小了\n");
        return EOF;
    }
    // 2、创建新空间
    F_data *data = NULL;
    data = (F_data *)malloc(size * sizeof(F_data));
    if (NULL == L->data)
    {
        printf("数据空间创建失败\n");
        return EOF;
    }
    // 3、数据拷贝
    for (int i = 0; i < L->len; i++)
    {
        data[i] = L->data[i];
    }

    // 4、更新
    L->max = size;

    // 5、销毁原数据
    free(L->data);

    // 6、改写新空间地址
    L->data = data;
    return 0;
}

// 顺序表的尾插
int tail_insert_tail(S_arr_list *L, F_data data)
{
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return EOF;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return EOF;
    }
    if (L->len >= L->max)
    {
        printf("数据空间满了不能存\n");
        return EOF;
    }

    // 2、插入数据
    L->data[L->len++] = data;

    return 0;
}

// 按位置插入
// 链表和顺序表的区别
// 链表方便 删 增
// 顺序表方便 查 改
int pos_insert_list(S_arr_list *L, int index, F_data data)
{
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return EOF;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return EOF;
    }
    if (L->len >= L->max)
    {
        printf("数据空间满了不能存\n");
        return EOF;
    }
    if (index >= L->len || index < 0)
    {
        printf("index 参数错误\n");
        return EOF;
    }

    // 循环移动
    for (int i = L->len - 1; i > index - 1; i--)
    {
        L->data[i + 1] = L->data[i];
        // printf("开始移动L->data[%d] ->>  L->data[%d]\n" , i , i + 1);
    }

    // 赋值操作
    L->data[index] = data;

    // 更新操作
    L->len++;

    return 0;
}
// 尾删
F_data tail_del_list(S_arr_list *L)
{
    F_data data;
    memset(&data, 0, sizeof(F_data));
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return data;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return data;
    }
    if (0 >= L->len)
    {
        printf("数据空间为空\n");
        return data;
    }
    // 删除
    L->len--;
    // 回传被删除的数据
    return L->data[L->len];
}

// 按位置删除
F_data pos_del_list(S_arr_list *L, int index)
{
    F_data data;
    memset(&data, 0, sizeof(F_data));
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return data;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return data;
    }
    if (0 >= L->len)
    {
        printf("数据空间为空\n");
        return data;
    }
    if (index >= L->len || index < 0)
    {
        printf("index 参数错误\n");
        return data;
    }
    // 循环移动
    data = L->data[index];
    for (int i = index; i < L->len; i++)
    {
        L->data[i] = L->data[i + 1];
        // printf("开始移动L->data[%d] ->>  L->data[%d]\n" , i , i + 1);
    }
    // 更新迭代
    L->len--;
    // 返回被删除的数据
    return data;
}
// 按航班号删除
F_data id_del_list(S_arr_list *L, F_data data)
{
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return data;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return data;
    }
    if (0 >= L->len)
    {
        printf("数据空间为空\n");
        return data;
    }
    int i = find_by_id(L, data.id);
    if (EOF == i)
    {
        printf("没有该航班,无法退票\n");
        return data;
    }

    // 循环移动
    for (int j = i; j < L->len; j++)
    {
        L->data[j] = L->data[j + 1];
    }
    // 删除
    L->len--;
    // 返回被删除的数据
    return data;
}

// 通过航班查找 成功返回 下标  失败返回 EOF
int find_by_id(S_arr_list *L, int id)
{
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return EOF;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return EOF;
    }
    // 遍历查询
    for (int i = 0; i < L->len; i++)
    {
        if (L->data[i].id == id) // 开始比对
        {
            return i;
        }
    }
    // 没找到 返回 -1
    return EOF;
}
// //顺序表的遍历：
int printf_S_arr_list(S_arr_list *L)
{
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return -1;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return -1 ;
    }
    if (0 >= L->len)
    {
        printf("没有订单\n");
        return 0 ;
    }
    printf("--------------------------------------------------------------------------------------------------\n");
    printf("班次    机型        起点站  终点站  起飞时间    到达时间    飞行时间    票价  载客量  剩余座位  是否飞\n");
    printf("--------------------------------------------------------------------------------------------------\n");
    for (int i = 0; i < L->len; i++)
    {
        printf("%-6d", L->data[i].id);
        printf("%-15s", L->data[i].flighttype);
        printf("%-10s", L->data[i].startcity);
        printf("%-10s", L->data[i].arrivecity);
        printf("%02d:%02d\t", L->data[i].starttime[0], L->data[i].starttime[1]);
        printf("%02d:%02d\t    ", L->data[i].arrivetime[0], L->data[i].arrivetime[1]);
        printf("%-10s\t", L->data[i].flytime);
        printf("%-6d", L->data[i].value);
        printf("%-8d", L->data[i].maxNUM);
        printf("%-8d  ", L->data[i].leftbuyersa);
        printf("%c\n", L->data[i].whetherfly);
    }
    return 1;
}

// 顺序表的判空： 为空 返回 0  不为空返回 1
int IsEmpty_S_arr_list(S_arr_list *L)
{
    // 不为空
    if (L->len > 0)
    {
        return 1;
    }
    // 为空
    return 0;
}
// 顺序表的清空：
void Clear_S_arr_list(S_arr_list *L)
{
    L->len = 0;
}

// 指针的销毁
void Destroy_S_arr_list(S_arr_list **L)
{
    if (NULL == *L)
    {
        printf("这片空间不能存在\n");
    }
    // 释放数据空间
    free((*L)->data);
    (*L)->data = NULL;
    // 释放结构空间
    free(*L);
    *L = NULL;
}
